import java.util.Arrays;
import java.util.Scanner;

/**
 * <p>
 *
 * </p>
 *
 * @author 12071
 * @date 2022/10/24 19:33
 */
public class ZhejiangJiaohang {
    /**
     * 给出一个数组，A={a1，a2，......，an}其中ai（1＜=i＜=n）为正整数，小明希望知道A中最长的双重上升子序列有多长。子序列是在原来的序列中选择某些元素，将这些元素按照原序列的顺序排列所组成的序列。
     *
     * 8
     * 1 6 3 2 7 4 3 5
     * output: 6
     */
    public static int[] hist = new int[1000001];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        if(n<3){
            System.out.println(n);
            return;
        }
        int[] nums = new int[n];
        int dp[][] = new int[n][2];
        for (int i = 0; i < n; i++) {
            nums[i] = sc.nextInt();
            if(i!=0){
                dp[i][0] = 2;
                dp[i][1] = 0;
            }
        }
        int max = 0;
        for (int i = 2; i < n; i++) {
            for (int j = i-1; j >=0 ; j--) {
                if(nums[dp[j][1]]<nums[i] && dp[j][0]>=dp[i][0]){
                    dp[i][0] = dp[j][0]+1;
                    dp[i][1] = j;
                }
            }
            max = Math.max(dp[i][0], max);
        }
        System.out.println(max);
    }

    /**
     * 我们称一个正整数 x 是好的，当且仅当 |x-rev(x)| 是回文数。
     * rev(x) 表示将自然数x十进制下的无多余前缀零的表示方式反转后得到的数字。
     * 如rev(114514)=415411，
     * rev(1919810)=189191；
     * |x| 表示 x 的绝对值；
     * 一个自然数 x 是回文数，当且仅当 rev(x)=x。
     * 请求出区间[l, r] 中的所有正整数中，有多少个好的数。
     * 输入包含多组样例。
     *
     * @param args
     * 第一行一个正整数 t 表示数据组数。
     * 接下来 t 行，每行两个正整数 l r (l<=r) 表示区间端点。
     * 对于所有数据，1<=t<=10000 1<=l, r<=1000000。
     *
     * @return
     * 每组样例输出一个正整数，表示答案。
     *
     * 2
     * 11 13
     * 13 15
     * output:
     * 2
     * 0
     * 样例解释
     * 第一组
     * |11-11|=0，是回文数。
     * |12-21|=9，是回文数。
     * |13-31|=18，不是回文数。
     * 所以答案为2。
     * 第二组
     * |13-31|=18，不是回文数。
     * |14-41|=27，不是回文数。
     * |15-51|=36，不是回文数。
     * 所以答案为0。
     */
    public static void B(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        for (int k = 0; k < t; k++) {
            int l = sc.nextInt();
            int r = sc.nextInt();
            int count =0;
            for (int i = l; i <= r; i++) {
                if(hist[i] == 1) {
                    count++;
                    continue;
                }
                int j = rev(i);
                int x = Math.abs(i-j);
                if(isValid(x)){
                    count++;
                    hist[i] = 1;
                    hist[j] = 1;
                }
            }
            System.out.println(count);
        }
    }

    public static int rev(int num) {
        int res = 0;
        while(num>0){
            res = res *10 +num%10;
            num /= 10;
        }
        return res;
    }

    public static boolean isValid(String num) {
        char[] chars = num.toCharArray();
        int len = chars.length;
        for (int i = 0; i < len / 2; i++) {
            if(chars[i] != chars[len-1-i])
                return false;
        }
        return true;
    }

    public static boolean isValid(int num){
        int tmp = num;
        int rev = 0;
        while (tmp>0){
            rev = rev *10 + tmp%10;
            tmp /=10;
        }
        return num==rev;
    }

    /**
     * 小明打完boss需要领取奖励。他必须从N个奖励物品中选择恰好M个。作为游戏特色的一环，这些奖励物品中可能会有一些负收益，需要小明从中抉择，小明获得的总收益为选中的这M个物品收益之和。请你帮帮小明，使得他可以让总收益最大化。
     * @param args
     * 第一行两个正整数N和M，含义如题面。
     * 接下来N个数，表示每个奖励物品会带来的收益。收益可能会为负。
     * 对于所有数据-100000≤a1≤100000
     * @return
     * 一个一个数，表示最大的总收益。
     *
     * 3 1
     * -1 -2 -3
     * output: -1
     */
    public static void A(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[] nums = new int[n];
        for(int i=0;i<n;i++){
            nums[i] = sc.nextInt();
        }
        Arrays.sort(nums);
        System.out.println(Arrays.toString(nums));
        long ans = 0;
        for(int i =0;i<m;i++){
            ans += nums[n-i-1];
        }
        System.out.println(ans);
    }
}
